#include <stdio.h>
#include <stdlib.h>

typedef struct Link{
    char elem;
    struct Link* next;
}Link_;

Link_* initLink(){
    Link_* p = NULL;
    Link_* temp = (Link_*)malloc(sizeof(Link_)); //创建首元节点

    temp->elem = 1;
    temp->next = NULL;

    p = temp;

    for(int i = 1; i < 5; i++){
        Link_* a = (Link_*)malloc(sizeof(Link_));
        a->elem = i;
        a->next = NULL;
        temp->next = a;
        temp = a;
    }
    return p;
}

Link_* initLink_(){
    Link_* p = (Link_*)malloc(sizeof(Link_));
    Link_* temp = p;
     for(int i = 0; i < 5; i++){
         Link_* a = (Link_*) malloc(sizeof(Link_));
         a->elem = i;
         a->next = NULL;
         temp->next = a;
         temp = a;
     }
     return p;
}

//带头节点
void display(Link_ *p){
    Link_* temp = p;
    while (temp){
        printf("%d", temp->elem);
        temp = temp->next;
    }
    printf("\n");
}

//不带头节点
void display_(Link_ *p){
    Link_* temp = p;
    while (temp){
        if(temp->next){
            temp = temp->next;
            printf("%d", temp->elem);
        }else{
            break;
        }
    }
    printf("\n");
}

Link_* insertElem(Link_* p, int elem, int add){
    Link_* temp = p;
    for(int i = 1; i < add; i++){
        temp = temp->next;
        if(temp == NULL){
            printf("插入的位置无效！\n");
            return p;
        }
    }
    Link_* a = (Link_*) malloc(sizeof(Link_));
    a->elem = elem;
    a->next = temp->next;

    temp->next = a;
    return p;
}

Link_* delElem(Link_* p, int add){
    Link_* temp = p;
    for(int i = 1; i < add; i++){
        temp = temp->next;
        if(temp->next == NULL){
            printf("没有该节点！\n");
            return p;
        }
    }
    Link_* del = temp->next;
    temp->next = temp->next->next;
    free(del);
    return p;
}

int selectElem(Link_* p, int elem){
    Link_* temp = p;
    int i = 1;
    while(temp->next){
        temp = temp->next;
        if(temp->elem == elem){
            return i;
        }
        i++;
    }
    return -1;
}

Link_* amendElem(Link_* p, int add, int newElem){
    Link_* temp = p;
    temp = temp->next;
    for(int i = 1; i < add; i++){
        temp = temp->next;
    }
    temp->elem = newElem;
    return p;
}

int main()
{
    Link_* p = initLink();
    Link_* p_ = initLink_();
    display(p);
    display_(p_);
    insertElem(p, 2, 2);
    delElem(p, 1);
    selectElem(p, 1);
    p = amendElem(p,2,7);
    display(p);

    return 0;
}